package loads

import (
	"hi-jvm/instructions/base"
	"hi-jvm/rtda"
)

/*
* 加载指令从局部变量表获取变量， 然后推入操作数栈。
* 加载指令共33条。可分为6类：
* 1： aload系列指令： 操作引用数据类型变量
* 2： dload系列指令：操作double类型变量
* 3： fload系列指令：操作float类型变量
* 4： iload系列指令：操作int类型变量
* 5： lload系列指令：操作long类型变量
* 6： xaload指令： 操作数据组
 */

// 指令码：0x15
type ILOAD struct{ base.Index8Instruction }
// 指令码：0x1a
type ILOAD_0 struct{ base.NoOperandsInstruction }
// 指令码：0x1b
type ILOAD_1 struct{ base.NoOperandsInstruction }
// 指令码：0x1c
type ILOAD_2 struct{ base.NoOperandsInstruction }
// 指令码：0x1d
type ILOAD_3 struct{ base.NoOperandsInstruction }

func (self *ILOAD) Execute(frame *rtda.Frame) {
	_iload(frame, self.Index)
}

func (self *ILOAD_0) Execute(frame *rtda.Frame) {
	_iload(frame, 0)
}

func (self *ILOAD_1) Execute(frame *rtda.Frame) {
	_iload(frame, 1)
}

func (self *ILOAD_2) Execute(frame *rtda.Frame) {
	_iload(frame, 2)
}

func (self *ILOAD_3) Execute(frame *rtda.Frame) {
	_iload(frame, 3)
}

func _iload(frame *rtda.Frame, index uint) {
	val := frame.LocalVars.GetInt(index)
	frame.OperandStack.PushInt(val)
}


